/**
 * 用户实体类 - 多租户用户管理系统的基础实体
 *
 * 开发人员：陈宏伟
 * 开发时间：2025-10-20 至 2025-10-25
 * 模块职责：定义系统用户的核心信息和业务属性，支持多租户用户管理和权限控制
 *
 * 技术要点：
 * - 多租户关联设计，与企业实体关联
 * - 密码加密存储机制（BCrypt哈希）
 * - 用户状态管理和登录时间跟踪
 * - 唯一性约束防止用户名和邮箱重复
 * - 审计字段自动维护用户信息变更
 *
 * 开发故事：负责用户实体的数据模型设计，与认证服务和权限管理系统深度配合，实现多租户用户的安全管理和权限控制。
 */
package com.pbl.entity;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.*;

import javax.persistence.*;
import java.time.LocalDateTime;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
@Table(name = "users")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "enterprise_id", nullable = false)
    private Enterprise enterprise;

    @Column(nullable = false, length = 64)
    private String username;

    @Column(length = 128)
    private String email;

    @Column(length = 32)
    private String phone;

    @Column(name = "password_hash", nullable = false, length = 255)
    private String passwordHash;

    @Column(nullable = false)
    private Integer status;

    @Column(name = "last_login_at")
    private LocalDateTime lastLoginAt;

    @Column(name = "created_at", insertable = false, updatable = false)
    private LocalDateTime createdAt;

    @Column(name = "updated_at", insertable = false, updatable = false)
    private LocalDateTime updatedAt;
}
